//#define ENCODER_DO_NOT_USE_INTERRUPTS

#include <Encoder.h>
#include "Tasks.h"

#define IDLE_TASK_SIZE 1000

class AutoKey autoKey;
MorseUtils morse;
Buzzer buzzer;
BleKeyboard Keyboard("Morse Key Adapter", "Sun's DIY"); //���С�ESP32�������̡�Ϊ�������ƣ�"Espressif"Ϊ������
void KeySignTask(void *param);
void UiHandlerTask(void *param);
void Core0Task(void *param);
Encoder knob(25, 26);
unsigned int key_mode = 1;
unsigned int c1 = 0, c2 = 0;
void cw_init()
{
  Keyboard.begin();
  buzzer.init();
  autoKey.init();

  Serial.begin(115200);
  //Serial.setDebugOutput(true);
  //Serial.println("Start init");
  // ui.init();
  delay(500);
  Serial.println("END UI init");
  xTaskCreatePinnedToCore(KeySignTask, "AutoGenSignTask", 8192 * 2 , NULL, 2, NULL, 1);     //�����Զ�������
  xTaskCreatePinnedToCore(UiHandlerTask, "UI Loop Task", 8192 * 6, NULL, 2, NULL, 1); //������������
  Serial.println("END CREATE TASK");
  //xTaskCreate(Core0Task, "For Test Task", 4096, NULL, 1, NULL); //������������
  /*
  /*
  xTaskCreatePinnedToCore(Core0Task,           //任务函数
                          "Core0 WTD Task",         //这个参数没有什么作用，仅作为任务的描述
                          2048,            //任务栈的大小
                          (void *) "Core0",         //传给任务函数的参数
                          2,              //优先级，数字越大优先级越高
                          NULL,            //传回的句柄，不需要的话可以为NULL
                          0); //指定运行任务的ＣＰＵ，使用tskNO_AFFINITY这个宏表示不会固定到任何核上
  */
  vTaskStartScheduler();
  Serial.println("END START SCHEDULER init");
}
/*
void vApplicationTickHook()
{
  Serial.println("vApplicationTickHook 00");
	// 告诉lvgl已经过去了1毫秒
	lv_tick_inc(1);
}*/
void UiHandlerTask(void *param)
{
  ui.init();
  while (true)
  {
    ui.ui_loop();
    //lv_timer_handler();
    vTaskDelay(2 / portTICK_PERIOD_MS);
    /*
    c1++;
    if (c1 > 1000) {
      c1 = 0;
      vTaskDelay(1 / portTICK_PERIOD_MS);
    }
    */
  }
}
void KeySignTask(void *param)
{
  while (1)
  {
    if (key_mode == 1)
    {
      autoKey.run();
    }
    else if (key_mode == 2)
    {
      straight_run();
    }
    c2++;
    if (c2 > 1000) {
      c2 = 0;
      vTaskDelay(2 / portTICK_PERIOD_MS);
    }
  }
}
